package com.lyr.reflectdemo;

import java.lang.reflect.Method;
import java.util.concurrent.Callable;

public class TestStu02 {
    public static void main(String[] args) {

        test02();
    }

    /**
     * 获取类下所有方法
     */
    public static void test02(){
        // 获取类文件对象
        Class typ1=Student.class;
        try {
             //使用指定方法名和参数列表指定具体的Method对象
            Method md=typ1.getDeclaredMethod("sayHi");
            Method md2=typ1.getDeclaredMethod("sayHi", String.class);

            //使用Class类newInstance()方法，实例化对象
            Student st=(Student) typ1.newInstance();
            System.out.println("调用空参的sayHi方法：");

            //使用Method类的invoke方法，执行该方法
            //第一个参数，是执行该方法的对象
            //第二个参数，需要给定实参，如果是空参的方法，此处可以不写
            md.invoke(st);
            System.out.println("调用有参的sayHi方法：");
            md2.invoke(st,"tom");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    /**
     * 获取类下所有方法
     */
    public static void test01(){
        // 获取类文件对象
        Class typ1=Student.class;
        // 获取该类下的所有方法
        Method[] md=typ1.getDeclaredMethods();

        for (Method m:md) {
            // 遍历所有方法，打印方法名
            System.out.println(m.getName());

        }
    }
}
